// 引入axios，并加到原型链中
import axios from "axios";
import _CONST from './const.util';
import store from '../../store/index';
import router from '../../router/index';
import { Notify  } from 'vant';
import { Toast } from 'vant';
// axios 配置
var service = axios.create({
  headers: {
    "Content-Type": "application/json"
  },
  timeout: 5000,
  baseURL: _CONST.BASE_URL,  //接口请求地址
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    store.commit("get_token")
    if (store.state.token) {
      config.headers.common[_CONST.TOKEN_RESPONSE_KEY] = store.state.token
    }else {
      delete config.headers.common[_CONST.TOKEN_RESPONSE_KEY]
    }
    config.headers.common["Access-Control-Allow-Origin"] = "*"
    return config;
  },
  error => Promise.reject(error)
)

// 响应拦截器
service.interceptors.response.use(
  // 请求成功:失败请求
  response => {
    const responseHeaders = response.headers
    // 判断响应头中是否有token信息,存在则刷新token
    if(responseHeaders[_CONST.TOKEN_RESPONSE_KEY.toLowerCase()]){
      store.commit('set_token', responseHeaders[_CONST.TOKEN_RESPONSE_KEY.toLowerCase()])
    }
    return response.data.success ? Promise.resolve(response.data) : errorHandle(response.data.code, response.data)
  },
  // 请求失败
  error => {
    const {response} = error;
    if (response) {
      // 请求失败处理
      errorHandle(response.status, response.data);
      return Promise.reject(response);
    } else {
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      //store.commit('changeNetwork', false);
      Notify({
        message: "网络异常",
        color: '#ad0000',
        background: '#ffe1e1',
      });
    }
  });
/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 * @param {Object} data 响应数据
 */
const errorHandle = (status, data) => {
  // 状态码判断
  switch (Number(status)) {
    case -1:
      Notify({ type: 'warning', message: data.errors });
      break;
    // 401: 暂未登录或token已经过期,跳转登录页面
    case 401:
      toLogin(data.errors);
      break;
    // 402 token解析异常，清除token并跳转登录页
    case 402:
      toLogin(data.errors);
      break;
    // 404请求不存在
    case 404:
      router.push({name:'404'})
      break;
    default:
      if(Number(status) > 1000){
        Notify({ type: 'warning', message: data.errors });
      }else {
        Notify({
          message: data.errors,
          color: '#ad0000',
          background: '#ffe1e1',
        });
      }
  }
  return Promise.reject(data);
}

function toLogin(msg) {
  router.push({
    name: "login",
    params:{msg: msg}
  });
}

export default service;